﻿using Max.PH4_2104A.Shopping.ThreeFrame.DAL;
using Max.PH4_2104A.Shopping.ThreeFrame.Model;

namespace Max.PH4_2104A.Shopping.ThreeFrame.BLL
{
    /// <summary>
    /// 系统用户的业务逻辑处理
    /// </summary>
    public class SystemUserBLL
    {
        SystemUserDAL _dal;

        public SystemUserBLL(SystemUserDAL dal)
        {
            _dal = dal;
        }


        /// <summary>
        /// 添加系统用户信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public (bool,string) Insert(SystemUserModel model)
        {
            //一、判重（判断登录名是否唯一）
            /*
             * 1、去数据表中所有数据去查询，根据登录名称去查询
             * 2、判断查询结果
             * **/
            var d = _dal.GetAll().Where(x => x.LoginName.Equals(model.LoginName)).FirstOrDefault();
            if(d != null)
            {
                //说明：这个登录名已存在，就不能继续添加
                return (false, "登录名已存在");
            }

            //二、密码进行加密处理（用MD5）
            /*
             * 1、安装md5包
             * 2、string key = MD5Hash.Hash.Content("123");  //这名代码的意思就是把字符串123进行md5加密处理
             * **/
            model.Password = MD5Hash.Hash.Content(model.Password);  //先把用户的输入的密码进行md5加密，再把加密后的数据重新赋值给model对象

            int result= _dal.Insert(model);

            return (true,"添加成功");
        }


        /// <summary>
        /// 查询分页数据
        /// </summary>
        /// <param name="name">用户姓名</param>
        /// <param name="pageIndex">页码（第几页）</param>
        /// <param name="pageSize">页大小（每页显示几条）</param>
        /// <param name="total">符合条件的总记录数</param>
        /// <returns></returns>
        public IQueryable<SystemUserModel> Query(string? name,int pageIndex,int pageSize,out int total)
        {
            //根据name进行模糊查询
            var d = _dal.GetAll().Where(x => x.Name.Contains(name ?? ""));

            //将查询的结果总记录给total赋值
            total = d.Count();

            //分页处理
            d = d.Skip((pageIndex - 1) * pageSize).Take(pageSize);

            return d;
        }

        /// <summary>
        /// 系统用户登录
        /// </summary>
        /// <param name="loginName">登录名</param>
        /// <param name="password">密码</param>
        /// <returns></returns>
        public (bool,string,SystemUserModel) Login(string loginName,string password)
        {
            /*
             * 密码加密为什么选择MD5
             * MD5-------不可逆（可以通过暴力破解---穷举法）
             * 
             * **/

            //因为数据表中的密码是通过md5加密的，而现在前台传过来的是明文，所以需要把明文加密后和数据表中的数据进行匹配
            password = MD5Hash.Hash.Content(password);

            //根据登录名和密码去数据表中，找这条数据
            var d = _dal.GetAll().Where(x => x.LoginName.Equals(loginName) && x.Password.Equals(password) && !x.IsDeleted).FirstOrDefault();

            if(d == null)
            {
                //数据表中不存在这个用户名和密码匹配的数据
                return (false, "用户名或密码有误或用户不存在", null);
            }

            if(!d.State.Equals("0"))
            {
                return (false, "用户已禁用", null);
            }

            return (true, "登录成功", d);
        }

        public int Update(List<SystemUserModel> models)
        {
            models.ForEach(x =>
            {
                x.IsDeleted = true;
            });
            _dal.Update(models);
            return 1;
        }
    }
}